package org.liuwei.rxjava;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.TimeUnit;

import rx.Observable;
import rx.Subscriber;
import rx.functions.Func0;
/**
 *@see https://my.oschina.net/u/1266221/blog/952634
* @Description: RXjava 基本使用示例
* @author wei.liu   
* @date 2017年6月14日 下午1:58:20 
* @version V1.0
 */
public class demo2 {

	public static void main(String[] args) {
		// 1.使用create( ),最基本的创建方式：
		Observable<String> normalObservable = Observable.create(new Observable.OnSubscribe<String>() {
			@Override
			public void call(Subscriber<? super String> subscriber) {
				subscriber.onNext("create1"); // 发射一个"create1"的String
				subscriber.onNext("create2"); // 发射一个"create2"的String
				subscriber.onCompleted();// 发射完成,这种方法需要手动调用onCompleted，才会回调Observer的onCompleted方法
			}
		});

		// 2.使用just( )，将为你创建一个Observable并自动为你调用onNext( )发射数据：
		Observable<String> justObservable = Observable.just("just1", "just2");// 依次发送"just1"和"just2"

		// 3.使用from( )，遍历集合，发送每个item：
		List<String> list = new ArrayList<>();
		list.add("from1");
		list.add("from2");
		list.add("from3");
		Object fromObservable = Observable.from(list); // 遍历list 每次发送一个
		/**
		 * 注意，just()方法也可以传list，但是发送的是整个list对象，而from（）发送的是list的一个item** /
		 */

		// 4.使用defer( )，有观察者订阅时才创建Observable，并且为每个观察者创建一个新的Observable：
		Observable<String> deferObservable = Observable.defer(new Func0<Observable<String>>() {
			@Override
			// 注意此处的call方法没有Subscriber参数
			public Observable<String> call() {
				return Observable.just("deferObservable");
			}
		});

		// 5.使用interval( ),创建一个按固定时间间隔发射整数序列的Observable，可用作定时器：
		Observable<Long> intervalObservable = Observable.interval(1, TimeUnit.SECONDS);// 每隔一秒发送一次
		
		
		//6.使用range( ),创建一个发射特定整数序列的Observable，
		//第一个参数为起始值，第二个为发送的个数，如果为0则不发送，负数则抛异常：
		Observable<Integer> rangeObservable = Observable.range(10, 5);//将发送整数10，11，12，13，14
	
	
	
		//7.使用timer( ),创建一个Observable，它在一个给定的延迟后发射一个特殊的值，
		//等同于Android中Handler的postDelay( )方法：
		Observable<Long> timeObservable = Observable.timer(3, TimeUnit.SECONDS);  //3秒后发射一个值
	
		//8.使用repeat( ),创建一个重复发射特定数据的Observable:
		Observable<String> repeatObservable = Observable.just("repeatObservable").repeat(3);//重复发射3次
	}

}
